По заданным двум
строкам a и b следует вывести такую строку x
наибольшей длины, которая одновременно является подстрокой перестановки a и подстрокой перестановки b.
Вход. Состоит из нескольких тестов, каждый их которых содержит
две строки. Каждая строка состоит из символов нижнего регистра, причём первой
строкой в паре является a, а второй
строкой b. Максимальная длина каждой
строки 1000 символов.
Выход. Для каждого
теста выведите строку x. Если таких
строк несколько, то выведите наименьшую в алфавитном порядке.
Пример
входа |
Пример
выхода |
pretty women walking down the
street |
e nw et |
структуры
данных - map
Анализ алгоритма
Подсчитаем
количество каждой буквы, которая встречается в a и b. Находим, сколько и
каких букв одновременно принадлежит строкам a
и b. Выводим их (с учетом количества)
в алфавитном порядке.
Реализация алгоритма
Входные строки
считываем в массивы a и b. В отображениях aa и bb будем
подсчитывать, сколько и каких букв содержится в a и b.
char a[1010], b[1010];
map<char,int> aa, bb;
Для каждого
теста читаем входные строки a и b. Заполняем отображения aa и bb.
while(gets(a))
{
gets(b);
aa.clear(); bb.clear();
for(i = 0; i
< strlen(a); i++) aa[a[i]]++;
for(i = 0; i
< strlen(b); i++) bb[b[i]]++;
Выводим общие буквы строк a и b в
алфавитном порядке. При этом каждую букву выводим столько раз, сколько она
встречается одновременно в a и b.
for(i = 'a'; i <= 'z';
i++)
{
m = min(aa[i],bb[i]);
for(j = 0;
j < m; j++) printf("%c",i);
}
printf("\n");
}
Java реализация
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
while(con.hasNext())
{
String a = con.nextLine();
String b = con.nextLine();
int aa[] = new int[256];
int bb[] = new int[256];
for(int i = 0; i < a.length(); i++)
aa[a.charAt(i)]++;
for(int i = 0; i < b.length(); i++)
bb[b.charAt(i)]++;
for(int i = 'a'; i <= 'z';
i++)
{
int m = Math.min(aa[i],bb[i]);
for(int j = 0; j < m; j++) System.out.print((char)i);
}
System.out.println();
}
}
}